package com.huluobo.a2308douyindemo.login

import androidx.lifecycle.MutableLiveData
import com.huluobo.a2308douyindemo.bean.AccountBean
import com.huluobo.a2308douyindemo.bean.User7012Bean
import com.huluobo.a2308douyindemo.bean.UserBean
import com.huluobo.a2308douyindemo.mvvm.BaseViewModel
import com.huluobo.a2308douyindemo.net.ApiService
import com.huluobo.a2308douyindemo.net.ApiServiceGift
import com.huluobo.a2308douyindemo.net.Res
import com.huluobo.a2308douyindemo.utils.UnPeekLiveData
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject

/**
 *  Created by LC on 2025/10/17.
 *  @Inject 注入,使用hilt的时候需要在构造方法中注入对象
 *  constructor 构造方法
 *  在当前类中使用ApiService的时候,会通过hilt自动依赖注入对象,不需要再手动赋值
 *  @HiltViewModel 使用hilt需要在ViewModel上加注解
 *  @AndroidEntryPoint 同样Activity也需要加注解
 *
 */

@HiltViewModel
class LoginViewModel @Inject constructor(
    private val apiService: ApiService,
    private val apiServiceGift: ApiServiceGift
) : BaseViewModel() {

//    //成功的LiveData
//    val loginSuccess by lazy { MutableLiveData<UserBean>() }
//    fun login(map: Map<String, Any>) {
//        //请求方法中,数据流转的过程
//        //1.第一个参数的方法有返回值,返回值是UserBean
//        //2.第二个参数的方法没有返回,会吧UserBean存放到登录成功(loginSuccess)的LiveData中,方便观察
//        //3.接下来,在Activity中,可以观察到成功的LiveData
//
//        executeNetwork(
//            //第一个参数是个方法,需要用大括号包裹
//            { apiService.login(mapToJson(map)) },
//            //第二个参数也是个方法,他没有返回值,可以不用大括号包裹,直接调用成功的赋值
//            loginSuccess::postValue
//        )
//    }

    val loginSuccess by lazy { UnPeekLiveData<Res<UserBean>>() }
    fun login(username: String, password: String) {
        executeNetwork(
            { apiService.login(username, password) },
            loginSuccess::setContentValue
        )
    }

    val getAccountSuccess by lazy { UnPeekLiveData<Res<AccountBean>>() }
    fun getAccount(userId: Int) {
        executeNetwork(
            { apiService.getAccountByUserId(userId) },
            getAccountSuccess::setContentValue
        )
    }

    val login7012Success by lazy { UnPeekLiveData<Res<User7012Bean>>() }
    fun login7012(map: Map<String, String>) {
        executeNetwork(
            { apiServiceGift.login(mapToJson(map)) },
            login7012Success::setContentValue
        )
    }
}